フロー記述のオレオレ形式作る
概要
・処理の並列分岐
・処理の合流/待機
・値の受け渡し
をとあるサーバからサーバ群に渡すために、1ラインで書ける記法が欲しかった。
で、探したけど良いのが無かった。
ので、作る話。
パーサの実装はScala。
対象
jar(内部でshellを制御するものもアリ)
記法
A>B,C,D(A:a:c)>E(D:d:e),F(A:a2:f, B:b:f2)<J,K>I(J:j:i)+D>G>H+G>J!Z
Aとかは、JSONで別途記述する、「プロセスオーダー」 いわゆる ジョブ の、
アイデンティティー。
プロセスオーダー Aがあるとき、それはshellとかjarとか通信とか、プロセスidを一つ持つような物事の単位とする。
JSONで表記する。
たとえばパラメータとしてAShell exec -key1 value1 -key2 value2 を受け取るshell AShell.shがあるとき、
{
"A":{
"type":"sh"
"class":"AShell.sh",
"exec":"exec",
"kv":{
"key1":"value1",
"key2":"value2"
}
}
}
解釈は→
AShell.sh exec -key1 value1 -key2 value2
typeがjarだったら、
java -jar Ashell.jar exec -key1 value1 -key2 value2
この情報を基礎に動作する。
→タイプ一覧は下記
ワンライナーにJSONとして与えれば良い。
ex:
{"A": {"class": "AShell","exec": "exec","kv": {"key1": "value1","key2": "value2"}},"B": {"class": "AShell","exec": "exec","kv": {"key1": "value1","key2": "value2"}},"C": {"class": "AShell","exec": "exec","kv": {"key1": "value1","key2": "value2"}}}
引数として上書きする分だけ、プロセス間渡しとかを行う形。
記述規約:
・> で終了時次プロセスに移行
・(プロセスID:代入元パラメータ:代入先パラメータ) D(A:a:c) で、プロセスオーダーDについて、Aのパラメータaをキーcに代入して実行
・+ で分岐.+Dとあれば、プロセスオーダーDが終了したら開始される並列分岐
・< で特定プロセスの終了待ち。<J,KでプロセスJ、Kの完了待ちを行う
・, で内容のArray化。複数要素の並列稼働
解説:
1.AからB,C,D3つの並列、DでA値aをcパラメータとして使用、すべて終わったらEに収束、 D,Fを並列。D値dをeとして使用、FではA値a2をf、B値bをf2として使用。
完了したらJ、Kの完了が来るまで待機、
Jが着たら実行して処理終了。
2.D完了時、G,Kへとプロセス分離、H完了後終了。
3.G完了後、Jへとプロセス分離、J完了後終了。
4.J,K完了後、Iを実行。J値jをiとして使用。
5.途中で何があっても、プロセスZが最後に実行される(finally節)。
パース順:
! :Filnallyの取得/プロセスオーダー群としてのID配布、コンテキスト生成
+ :並列シーケンスの列挙 -> 各シーケンス化
> :シーケンスの内容分解、列挙 -> プロセス群化
< :プロセス群に対するwaitの解釈 -> プロセス群へのwaitのアタッチ
, :プロセス群のArray化
(:::) :プロセスに対する予約、パラメータのlazy用意 ここが一番大変そう。
こんなもんか。
プロセス自体の詳細は、
・importの記述
・インスタンスの記述
・アイデンティティからexec作って実行コードに配置
ProcessOrderのタイプ一覧
process:Mondogrosso互換のプロセス。com,kissaki.mondogrossoパッケージの継承物で、要はimportが可能。
jar:外部.jarファイル。
sh:外部shellファイル。
値のマトリクスは下記表
プロセス内の話
プロセスIDと、JSONから得た情報
キーとバリューがあるはず
どうやって入力したい?
←できるだけ可変できるように、かつ確認しやすいように
←DBに値で持つ
←ファイルで持つ
その場合、load方法を指定できれば良いのか。
→HTTP系までつくるのめんどうだから、Ver1.0系は、愚直にやろう。コピペで行けるし。